先说问题和结论
问题
首先是因为我出现了这样的 Bug:
我的 cmds7 明明填充的是 LP 模式,但是打印中却说是 HS 模式。
我在一个帖子中看到说 cmds 参数 不能为 8 和 16 的情况。
于是错误地将地将两者联系起来,认为参数为 8 或者 16 的情况下,LP 模式会被转换成 HS 模式。
于是希望跟着代码一探究竟。
真相
但是实际上两者是没有关联的。
真相是
其实是可以传递 8 字节 和 16 字节的参数的。
跟踪代码发现打印 LP mode 和 HS mode 这个输出信息的代码是根据 reg[0] 来判断的
1 | MIPI_DBG("%d command sent in %s size:%d\n", __LINE__, regs[0] ? "LP mode" : "HS mode", liTmp); |
我出现这种情况的原因,是因为擅自错误地将一个 36 字节的参数 拆分成 28 和 8 。
而后面 8 字节 cmds 的首字节 为 0x00。
也就是 reg[0] = 0x00 ,所以会输出 HS mode。
正文
假设我们有 8 个参数,那么 cmds 实际为 { 0x39,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88 }
cmd_len = length / sizeof(u32) = 9
在 video/rockchip/screen/lcd_mipi.c 中的 rk_mipi_screen_cmd_init 可以看到是调用
dsi_send_packet 这个函数来进行参数传递
1 | //... |
跟代码发现在 video/rockchip/transmitter/mipi_dsi.c 中
1 | int dsi_send_dcs_packet(unsigned int id, unsigned char *packet, u32 n) { |
ops->dsi_send_dcs_packet 这个实现是在 ops->的 dsi_send_dcs_packet
究其根源的实现是在
kernel/drivers/video/rockchip/transmitter/rk32_mipi_dsi.c
的 rk32_mipi_dsi_send_packet
1 | //arg 是要传输的通道,默认为 0 |
至此,疑问解决了。
看 LCD 的 datasheet 也可以发现,像之前所说的,
在 commond mode 的时候,这个参数,
也就是 屏IC 的 CMD,是不会为 0x00 的。
只有在 video mode 下才可能为 0x00。
而参数为 8 字节 和 16 字节 其实都可以,只要不超过 struct dsc_cmd 中定义的大小 400 ,就够了。